package spring.spring_aop.agencyMode;

/**
 * 代理模式
 * spring aop 是基于动态代理来实现aop的
 * 为其他对象提供了一种代理来控制对他的访问，当其他类要是需要访问这个类，那么是通过调用代理类来间接调用目标类的方法
 * 在某些环境下，调用方不适合直接调用目标类，而他可以调用一个中间的类，这个类代理这个目标类的方法起到中介的作用
 * 代理模式分为静态代理和动态代理
 * 静态代理：来运行之前就将代理方法给写死了
 * 动态代理：在运行之后通过程序的行为来通过反射机制来动态生成代理方法，是由程序生成的并没有在代码中显示定义
 */

//代理类 静态代理
public class proxy {

}

//定义房东和中介的行为
interface houseSubject{
    void rentHouse();
}

//房东的实际行为
class realHouseSubject implements houseSubject {
    @Override
    public void rentHouse() {
        System.out.println("房东出租");
    }
}

//代理房东的行为
class proxyHouseSubject implements houseSubject {
    //获取到代理对象
    private realHouseSubject realHouse;

    public proxyHouseSubject(realHouseSubject realHouse) {
        this.realHouse = realHouse;
    }

    @Override
    public void rentHouse() {
        System.out.println("中介代理出租");
        realHouse.rentHouse();
        System.out.println("代理结束");
    }
}

class mainRun {
    public static void main(String[] args) {
        //创建被代理对象 本来是要直接中国main来直接调用的，但是交给了代理对象，那么同过代理对象来间接调用
        realHouseSubject realHouseSubject = new realHouseSubject();

        proxyHouseSubject proxyHouseSubject = new proxyHouseSubject(realHouseSubject);

        proxyHouseSubject.rentHouse();
    }
}

